package com.indusfo.spc.controller;

import com.indusfo.spc.aspect.SystemControllerLog;
import com.indusfo.spc.config.PieceFlowConfig;
import com.indusfo.spc.exception.GlobalException;
import com.indusfo.spc.exception.UploadErrorException;
import com.indusfo.spc.pojo.Device;
import com.indusfo.spc.pojo.ExcelErrorData;
import com.indusfo.spc.service.DeviceService;
import com.indusfo.spc.untlis.ExcelUtil;
import com.indusfo.spc.untlis.GsonUtil;
import com.indusfo.spc.untlis.OfficeTransformThread;
import com.indusfo.spc.untlis.UuidUtil;
import com.indusfo.spc.vo.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 *	 类说明:设备资料控制器
 * 
 * @author XIET
 * 
 * @version 创建时间：2018年12月3日 上午11:11:44
 */

@Controller
@RequestMapping("/service/device")
public class DeviceController {

	@Autowired
	private DeviceService deviceService;
	
	/**
	 * 	查询设备资料
	 * @param device
	 * @return
	 */
	@RequestMapping("/queryDevice")
	@SystemControllerLog(description="查询设备资料")
	@ResponseBody
	public JSONObject queryDevice(Device device,String startDate,String endDate,String maintainStartDate,String maintainEndDate) {
		JSONObject jsonObject = deviceService.queryDevice(device,startDate,endDate,maintainStartDate,maintainEndDate);
		return jsonObject;
 	}
	
	/**
	 *	 删除设备资料
	 * @param deviceIds
	 * @param dataState
	 * @return
	 */
	@RequestMapping("/deleteDevice")
	@ResponseBody
	public JSONObject deleteDevice(Long[] deviceIds, Integer dataState) {
		dataState = 2;
		JSONObject jsonObject = deviceService.deleteDevice(deviceIds, dataState);
		return jsonObject;
	}
	
	/**
	 * 启用停用设备资料
	 * @param deviceIds
	 * @param dataState
	 * @return
	 */
	@RequestMapping("/definedDevice")
	@ResponseBody
	public JSONObject definedDevice(Long[] deviceIds, Integer dataState) {
		JSONObject jsonObject = deviceService.deleteDevice(deviceIds, dataState);
		return jsonObject;
	}
	/**
	 *	 新增设备资料
	 * @param device
	 * @return
	 */
	@RequestMapping("/insertDevice")
	@ResponseBody
	public JSONObject insertDevice(Device device) {
		JSONObject jsonObject = deviceService.insertDevice(device);
		return jsonObject;
	}
	
	/**
	 * 	修改设备资料
	 * @param device
	 * @return
	 */
	@RequestMapping("/updateDevice")
	@ResponseBody
	public JSONObject updateDevice(Device device) {
		JSONObject jsonObject = deviceService.updateDevice(device);
		return jsonObject;
	}
	
	/**
	 * 	查询工位
	 * @param lProductionLineId
	 * @return
	 */
	@RequestMapping("/queryLStation")
	@ResponseBody
	public JSONObject queryLStation(Integer lProductionLineId) {
		JSONObject jsonObject = deviceService.queryLStation(lProductionLineId);
		return jsonObject;
	}
	@RequestMapping("/uploadFileDevice")
	@ResponseBody
	public JSONObject uploadFileDevice(@RequestParam("file") MultipartFile file, Boolean way, HttpServletRequest request, HttpServletResponse response) throws IOException, ParseException {

		//定义一个message对象用于向前台传输数据
		JSONObject jsonObject=new JSONObject();
		jsonObject.setStatus(JSONObject.SUCCESS);

		//设置错误集合的
		List<ExcelErrorData> errorDatas = new ArrayList<>();
		response.setContentType("text/html;charset=UTF-8");
		//判断上传文件格式是否正确
		Workbook wb = ExcelUtil.getWorkbook(file.getInputStream(), ExcelUtil.isExcel2007(file.getOriginalFilename()));
		if (wb == null) {
			jsonObject.setStatus(JSONObject.ERROR);
			jsonObject.setMsg("文件解析错误");
			errorDatas.add(ExcelErrorData.getExcelErrorData(0, 0, "文件解析错误"));
		} else {
			//获取excel文件的第一个sheet
			Sheet sheet = wb.getSheetAt(0);
			if (sheet == null) {
				jsonObject.setStatus(JSONObject.ERROR);
				jsonObject.setMsg("未找到需要导入的表格");
				errorDatas.add(ExcelErrorData.getExcelErrorData(0, 0, "未找到需要导入的表格"));
			} else {
				//获取最后一行的行号
				int rowCount = sheet.getLastRowNum();
				if (rowCount < 1) {
					jsonObject.setStatus(JSONObject.ERROR);
					jsonObject.setMsg("未找到需要导入的数据，请确认表格是否保存！！！");
					errorDatas.add(ExcelErrorData.getExcelErrorData(0, "未找到需要导入的数据，请确认表格是否保存！！！"));
				} else {
					List<Device> deviceArrayList = new ArrayList<>();
					for (int i = 1; i <= rowCount; i++) {
						boolean needAdd = true;
						//获取到每一行的每一列的数据
						//设备编码
						String vcDeviceCode =com.indusfo.spc.untlis.ExcelUtil.getCellValue(sheet, i, 0, false);
						//设备名称
						String vcDeviceName = com.indusfo.spc.untlis.ExcelUtil.getCellValue(sheet, i, 1, false);
						//产线名称
						String vcProductionLineName = com.indusfo.spc.untlis.ExcelUtil.getCellValue(sheet, i, 2, false);
						//工位名称
						String lStationName = com.indusfo.spc.untlis.ExcelUtil.getCellValue(sheet, i, 3, false);
						//类型
						String typeName = com.indusfo.spc.untlis.ExcelUtil.getCellValue(sheet, i, 4, false);
						//MAC地址
						String vcMac = com.indusfo.spc.untlis.ExcelUtil.getCellValue(sheet, i, 5, false);
						//保养周期
						String maintainPeriodContent = com.indusfo.spc.untlis.ExcelUtil.getCellValue(sheet, i, 6, false);
						Integer maintainPeriod=null;
						if(!StringUtils.isBlank(maintainPeriodContent)){
                            if(StringUtils.isNumeric(maintainPeriodContent)){
                                maintainPeriod=Integer.parseInt(maintainPeriodContent);
                            }
                        }

						Device device = new Device(vcDeviceCode,vcDeviceName,vcMac,typeName,vcProductionLineName,lStationName,maintainPeriod);
						int m = i + 1;
						//将excel中的每一行数据存储进行检查
						String result = deviceService.checkNoRepeatExcel(device);
						if(result!=null){
							errorDatas.add(ExcelErrorData.getExcelErrorData(i, result));
							needAdd=false;
						}
						for (int j = 1; j < i; j++) {
							//判断检测项目编码
							String oldvcDeviceCode = StringUtils.trimToEmpty(com.indusfo.spc.untlis.ExcelUtil.getCellValue(sheet, j, 0, false)).replaceAll("\\s*", "");
							String oldvcDeviceName = StringUtils.trimToEmpty(com.indusfo.spc.untlis.ExcelUtil.getCellValue(sheet, j, 1, false)).replaceAll("\\s*", "");
							if (!StringUtils.isEmpty(vcDeviceCode) && !StringUtils.isEmpty(oldvcDeviceCode) && oldvcDeviceCode.equals(vcDeviceCode)) {
								needAdd = false;
								errorDatas.add( ExcelErrorData.getExcelErrorData(i, "与表格中第" + j + "行存在相同检测设备编码"));
							}
							if (!StringUtils.isEmpty(vcDeviceName)  && !StringUtils.isEmpty(oldvcDeviceName) && oldvcDeviceName.equals(vcDeviceName)) {
								needAdd = false;
								errorDatas.add( ExcelErrorData.getExcelErrorData(i, "与表格中第" + j + "行存在相同检测设备名称"));
							}
						}
						if (needAdd) {
							deviceArrayList.add(device);
						} else {
							jsonObject.setStatus(JSONObject.ERROR);
							jsonObject.setMsg("导入数据中存在异常信息");
						}
					}
					//根据这些来判断是否是中止导入还是跳过继续进行导入
					//根据这些来判断是否是中止导入还是跳过继续进行导入
					if (jsonObject.getStatus().equals(JSONObject.ERROR) && !way) {
						jsonObject.setMsg(jsonObject.getMsg()+ ",中止导入");
					} else {
						if (deviceArrayList.size() > 0) {
							try {
								deviceService.updateListDevice(deviceArrayList);
								//当程序执行到这里时,判断信息是否为空为空的话设置导入成功
								jsonObject.setMsg(StringUtils.isBlank(jsonObject.getMsg()) ? "导入成功" : jsonObject.getMsg());
								if ("导入成功".equals(jsonObject.getMsg())) {
									jsonObject.setStatus(JSONObject.SUCCESS);
								}
							} catch (Exception e) {
								e.printStackTrace();
								jsonObject.setMsg("导入失败");
							}
						}
					}
					//msg.setData(GsonUtil.toJson(errorDatas));
				}
			}
		}
		jsonObject.setData(GsonUtil.toJson(errorDatas));
		return JSONObject.build(JSONObject.SUCCESS,jsonObject.getMsg(),errorDatas);
	}

	//文件上传
	@RequestMapping(value = "/insertFile")
	@ResponseBody
	public JSONObject insertFile(@RequestParam(value = "file") MultipartFile file) {
		try {
			// 获取当前时间
			Date date = new Date();
			// 获取文件名
			String content = file.getOriginalFilename();

			// 转换为统一的小写形式
			String fileName = content.toLowerCase();

			// 获取图片的后缀名.doc
			String fileType = fileName.substring(fileName.lastIndexOf("."));

			// 判断是否为图片
			if (!fileName.matches("^.*(png|jpg|jpeg)$")) {
				// 说明:如果传递的文件不是指定的格式,直接程序结束
				throw new UploadErrorException("上传的文件格式不符合要求");
			}
			// 将文件分年月存储 yyyy/MM/dd
			String datePath = new SimpleDateFormat("yyyy/MM/dd").format(date);
			// 存放的目标目录
			String target = PieceFlowConfig.getProfile();
			// 判断是否有该文件夹:项E/upload/2018/10/09
			String fileDir = target + datePath;
			File fileFile = new File(fileDir);

			if (!fileFile.exists()) {
				// 没有则创建目录
				fileFile.mkdirs();
			}

			// 生成图片唯一标识码
			String uuid = UuidUtil.getUuid();

			// 拼接文件的名称
			String fileNowName = uuid + fileType;
			// 实现文件保存:E/upload/yyyy/MM/dd/1231231231231231231.jpg
			String realFilePath = fileDir + "/" + fileNowName;
			file.transferTo(new File(realFilePath));


//			// 开启一个线程，去执行word转pdf转png动作,图片格式不需要转换
//			if (fileType.matches("^.*(png|jpg|jpeg)$")) {
//				realFilePath = "/upload/" + datePath + "/" + fileNowName;
//			} else {
//				/**
//				 *  1,jacob-1.18-M2-x64.dll(64位) 将其放到了jdk/jre/bin文件夹下
//				 *  2、在C:\Windows\System32目录也复制一份jacob.dll。
//				 *  3, 将dll文件放到当前JDk和jre的lib目录中
//				 */
//				OfficeTransformThread officeT = new OfficeTransformThread(realFilePath);
//				new Thread(officeT).start();
//				realFilePath = "/upload/" + datePath + "/" + uuid + ".pdf";
//			}
			SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
			Map<String, Object> map = new HashMap<>();
			map.put("content", content);
			map.put("relUrl", realFilePath);
			map.put("uuid", UuidUtil.getUuid());
			map.put("modifyDate", df.format(date));
			// 将路径返回
			return JSONObject.build(JSONObject.SUCCESS, "上传成功!", map);
		} catch (GlobalException e) {
			// 捕获异常,打印并返回
			e.printStackTrace();
			return JSONObject.build(JSONObject.ERROR, e.getMessage());
		} catch (IllegalStateException e) {
			// 捕获异常,打印并返回
			e.printStackTrace();
			return JSONObject.build(JSONObject.ERROR, e.getMessage());
		} catch (IOException e) {
			// 捕获异常,打印并返回
			e.printStackTrace();
			return JSONObject.build(JSONObject.ERROR, e.getMessage());
		} catch (Exception e) {
			e.printStackTrace();
			return JSONObject.build(JSONObject.ERROR, e.getMessage());
		}
	}
}
